package cn.damong.service.weixin;

import cn.damong.service.response.ServiceResponse;
import cn.damong.weixin.mp.WeixinAuthType;
import cn.damong.weixin.mp.WeixinUserInfo;

/**
 * 微信公众号相关接口
 * 
 * @author CodingPanda
 * @2019年5月15日 下午10:50:42
 *
 */
public interface IWeixinService {
	
	/**
	 * 返回拼接的微信授权链接<br>
	 * 返回的授权链接中state字段默认为weixinAuthType，用于标识授权的类型。<br>
	 * 如果需要state字段绑定其他值，请调用{@link #IWeixinService.getAuthUrl(WeixinAuthType weixinAuthType, String state) }
	 * 
	 * @param weixinAuthType 微信授权类型，不能为null
	 * @return 拼接的微信授权链接, 如果weixinAuthType为null, 抛出NullPointException
	 */
	String getAuthUrl(WeixinAuthType weixinAuthType);
	
	/**
     * 返回拼接的微信授权链接
     * @param weixinAuthType 微信授权类型，不能为null
     * @param state 微信授权成功后会返回state到授权回调地址，可以填写a-zA-Z0-9的参数值，最多128字节, 不能为null
     * @return 拼接的微信授权链接, 如果weixinAuthType为null, 抛出NullPointException
     */
    String getAuthUrl(WeixinAuthType weixinAuthType, String state);
    
    /**
     * 通过授权Code从微信服务器拿AccessToken
     * 
     * @param code
     * @return <p>包含access_token的json字符串</p>
     * <p>result结果格式: <br>
     *  { <br>
     *      "access_token":"ACCESS_TOKEN", <br>
     *      "expires_in":7200,<br>
     *      "refresh_token":"REFRESH_TOKEN", <br>
     *      "openid":"OPENID", <br>
     *      "scope":"SCOPE" <br>
     *  }</p>
     */
    String fetchAccessToken(String code);
	
	/**
	 * 通过授权码获取用户的openid
	 * @param code
	 * @return
	 */
	ServiceResponse getOpenId(String code);
	
	/**
	 * 通过授权码获取用户详细信息
	 * @param code
	 * @return
	 */
	ServiceResponse getWeixinUserInfo(String code);

	/**
	 * 将用户信息持久化
	 * @param weixinUserInfo
	 * @return
	 */
	Integer saveWeixinUser(WeixinUserInfo weixinUserInfo);
	
}
